import { asyncRoutes, constantRoutes } from '@/router'
import { getMenu } from '@/api/menu'
import Layout from '@/layout'
/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  } else {
    return true
  }
}

/**
 * 静态路由懒加载
 * @param view  格式必须为 xxx/xxx 开头不要加斜杠
 * @returns
 */
export const loadView = (view) => {
  return (resolve) => require([`@/views/${view}.vue`], resolve)
}

/**
 * 后台查询的菜单数据拼装成路由格式的数据
 * @param routes
 * @param data
 */
export function generaMenu(routes, data) {
  const keepAlive = [
    '/personnel/files',
    '/approval/records'
  ]
  // debugger
  data.forEach(item => {
    let component = null
    if (item.component) {
      component = item.alwaysShow ? Layout : loadView(item.component)
    }
    const menu = {
      path: item.path + '',
      component: component,
      alwaysShow: item.alwaysShow,
      redirect: item.redirect,
      name: item.name + '',
      hidden: item.hidden,
      meta: item.meta
        ? {
          title: item.meta.title + '',
          icon: item.meta.icon,
          noCache: !keepAlive.includes(item.path)
        } : [],
      children: []
    }
    if (item.children) {
      generaMenu(menu.children, item.children)
    }
    routes.push(menu)
  })
}
/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
export function filterAsyncRoutes(routes, roles) {
  const res = []
  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })
  return res
}
const state = {
  routes: [],
  addRoutes: []
}
const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}
const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      // 先查询后台并返回左侧菜单数据并把数据添加到路由
      getMenu(true).then(response => {
        const data = response.data
        // Object.assign(loadMenuData, data)
        const a = []
        generaMenu(a, data)
        // a[2].children[3].component = Layout
        asyncRoutes.push(...a)
        let accessedRoutes
        if (roles.includes('admin')) {
          // alert(JSON.stringify(asyncRoutes))
          accessedRoutes = asyncRoutes || []
        } else {
          accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
        }
        commit('SET_ROUTES', accessedRoutes)
        resolve(accessedRoutes)
        // generaMenu(asyncRoutes, data)
      }).catch(error => {
      })
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
